package advanced进阶;

public class 各种锁 {
    /**
     * 常见的锁策略：
     *   乐观锁和悲观锁
     *   乐观和悲观是操作数据的一种态度
     *   乐观：认为这个数据没人改，所以不加锁，在修改之前，判断是否有其他线程对该数据进行了修改，未修改就进行修改，修改了就停止对数据的操作
     *   悲观：认为这个数据肯定有线程进行操作，所以在操作前，会先加锁
     *
     *   乐观锁和悲观锁没有好坏，都有适合的场景
     *
     *   乐观锁：适合读多写少的场景，更多的是读（没有冲突）
     *   悲观锁：适合写多读少的场景，对于数据的才做更多的是写（冲突较多）
     *
     *   synchronized既是乐观锁又是悲观锁
     *   最开始是乐观锁，随着冲突频率较多，就逐渐变为悲观锁
     *
     *
     * 读写锁
     * 对于数据的操作主要是读和写
     *   1>两个线程，对数据都是读操作 = >线程安全
     *   2>两个线程，一个读，一个写 = >线程不安全
     *   只要有写，线程就是不安全的
     *   基于这个原因，读写锁就出现了：
     *   读写锁，对数据的操作加锁分为读锁和写锁
     *   对于数据是读操作，加读锁
     *           写操作，加写锁
     *   读锁+读锁 不互斥
     *   读锁+写锁 互斥
     *   写锁+读锁 互斥
     *   synchronized是普通的互斥锁，不是读写锁
     *
     *
     *   重量级锁和轻量级锁
     *   是相对的
     *   重量级锁，做的比较多，性能比较慢
     *   轻量级锁，做的比较少，性能也较快
     *   大多数乐观锁是轻量级锁
     *        悲观锁是重量级锁   不绝对
     *
     *   重量级锁大多需要调用mutex互斥锁
     *   轻量级锁一般不会用到
     *   synchronized刚开始是轻量级锁，随着冲突增多，会逐渐升级为重量级锁
     *
     *
     *   自旋锁和挂起等待锁
     *   自旋锁伪代码：非真实代码
     *   while(抢锁(lock) == 失败){} 抢锁失败就不断循环，知道抢锁成功
     *   synchronized最开始也是自旋锁
     *
     *   公平锁和非公平锁
     *   synchronized是一个非公平锁
     *   公平锁：先到先得
     *   非公平锁：谁抢到谁的
     *   非公平锁一般情况下要优于公平锁
     *
     *
     *   可重入锁和不可重入锁
     *   synchronized是一个可重入锁，即自己不会把自己锁死
     *   不可重入锁：自己会把自己锁死
     *
     *
     * synchronized
     * 1.既是乐观锁也是悲观锁，开始时乐观锁，随着冲突的增多，逐渐变成悲观锁
     * 2.是一个普通互斥锁，不是读写锁
     * 3.既是轻量级锁，又是重量级锁，自适应的过程
     * 4.最开始是自旋锁，看锁的竞争激烈程度
     * 5.非公平锁
     * 6.可重入锁
     */
}
